#include <iostream>

using namespace std;

/*
 * 友元   让一个函数或类 访问另一个类中私有成员
 *  关键字 friend
 *  3种友元
 *      1、全局函数做友元
 *      2、类做友元
 *      3、成员函数做友元
 */

class GoodFriend;
class House;

class Friend{
public:
    Friend();
    void visit();
private:
    House *h;
};

class House{
    friend void goodGuy(House *h);  // 全局函数做友元
    friend class GoodFriend;  // 类做友元
    friend void Friend::visit();  // 成员函数做友元
public:
    string sittingRoom;
    House() {
        sittingRoom = "客厅";
        bedRoom = "卧室";
    }
private:
    string bedRoom;
};

Friend::Friend() {
    h = new House;
}

void Friend::visit() {
    cout << "Friend类正在访问 " << h->sittingRoom << endl;
    cout << "Friend类正在访问 " << h->bedRoom << endl;
}

class GoodFriend{
public:
    GoodFriend();
    void visit();
private:
    House *h;
};

// 类外实现成员函数
void GoodFriend::visit() {
    cout << "goodFriend类正在访问 " << h->sittingRoom << endl;
    cout << "goodFriend类正在访问 " << h->bedRoom << endl;
}

GoodFriend::GoodFriend() {
    h = new House;
}

void goodGuy(House *h) {
    cout << "正在访问：" << h->sittingRoom << endl;
    cout << "正在访问：" << h->bedRoom << endl;
}

void test01(){
    House h;
    goodGuy(&h);
}

void test02(){
    GoodFriend gf;
    gf.visit();
}

void test03(){
    Friend f1;
    f1.visit();
}

int main() {

    test01();
    test02();
    test03();
    return 0;
}
